package github.ziwukun.jsonql.lang;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * JSONQL语句抽象接口select语句
 * @author Hugo.Yu
 */
public interface Select extends ToJSONQLable,Serializable{
	public static Select readJson(String json) {
		return SelectJson.readJson(json);
	}
	
	public static SelectBuilder builder() {
		return new SelectBuilder();
	}
	
	/**所有搜索项*/
	List<SelectItem> listItems();
	/**搜索项是否为空*/
	boolean isItemsEmpty();
	/**是否包含指定属性的搜索项*/
	boolean containProp(String propName);
	/**获取指定属性的搜索项 注意没有属性会返回null*/
	Select propSelect(String propName);
	
	/**替换属性的名称*/
	Select repProp(String propName,String newProp);
	/**替换属性的名称 key旧名称 valu新名称*/
	Select repProps(Map<String, String> propNames);
	/**添加搜索项*/
	Select add(String prop);
	/**添加搜索项*/
	Select add(SelectItem prop);
	
	public static Select link(Select one,Select... others) {
		List<SelectItem> items = one.listItems();
		for(Select s:others) {
			items.addAll(s.listItems());
		}
		return new SelectImpl(items);
	}
	
	public static Select newInstance(List<SelectItem> items) {
		return new SelectImpl(items);
	}
}
